// 定义状态类型
export type State = {
  displayNavigation: any
  themeMode: "dark" | "light"
}
// 枚举 type 字段 类型
export enum ActionType {
  UPDATE = "UPDATE"
}
// 定义 类型
type UpdateAction = {
  type: ActionType.UPDATE //操作类型
  field: string //更新的字段
  value: any // 新的值
}
// 重新命名导出  将所有的操作组合在一起，作为对外统一的参数类型，不过目前我们只有一个操作 更新状态的某一个属性值
export type Action = UpdateAction

// 初始化 默认状态
export const initState: State = {
  displayNavigation: true,
  themeMode: "light"
}
// 定义 reducer 函数  接收两个参数 一个当前状态，一个调用更新函数时传过来的参数 这个参数的类型就是刚才定义的Action类型  根据动作的类型来确定如何更新状态 并返回更新后的状态
export function reducer(state: State, action: Action) {
  console.log(action)
  // 通过action type 字段来决定执行那种操作
  switch (action.type) {
    // 目前只有一种操作：更新状态的属性值
    case ActionType.UPDATE:
      // 将属性更新之后直接返回，返回的值会作为最新的状态，这样只需要在这里包装最新的状态对象，调用更新函数时就不需要进行包装了
      // console.log(action.value, [action.value])
      return { ...state, [action.field]: action.value }
    // 目前只有一种更新操作 其他的情况 抛出错误
    default: throw new Error()
  }
}
